package com.basker.pisces.domain.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.core.annotation.AliasFor;

/**
 * 标题输入DTO的字段，与指定的属性绑定
 *
 * @author hangwen
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(value = {ElementType.FIELD})
public @interface PropertyInput {

    /**
     * 绑定的实体别名，与propertyAlias互斥
     *
     * @return
     */
//    String childEntity() default "";

    /**
     * 如果绑定的属性是引用属性，标识录入的值是否是代码字段
     *
     * <p>
     * 与{@link #nameValue()}可同时为true，但优先按代码解析。如果与{@link #nameValue()}同时为false，当前字段会被认为是id值。
     *
     * @return
     */
    boolean codeValue() default false;

    /**
     * 绑定的属性是否是标识，对于标识属性，会从数据仓库加载对象，再进行填充，一个输入类只能存在一个标识属性
     *
     * @return
     */
    boolean identity() default false;

    /**
     * 是否忽略错误值，如果为true,会忽略错误,不进行赋值,反之会生成一个错误
     *
     * @return
     */
    boolean ignoreInvalid() default false;

    /**
     * 是否忽略null值，如果为true,不会将null值赋给数据实体
     *
     * @return
     */
    boolean ignoreNull() default true;

    /**
     * 如果绑定的属性是引用属性，标识录入的值是否是名称字段
     * <p>
     * 与{@link #codeValue()}可同时为true，但优先按代码解析。如果与{@link #codeValue()}同时为false，当前字段会被认为是id值。
     *
     * @return
     */
    boolean nameValue() default false;

    /**
     * 绑定的属性别名
     *
     * @return
     */
    @AliasFor("value")
    String propertyAlias() default "";

    @AliasFor("propertyAlias")
    String value() default "";
}
